package br.ufpi.hu.prescricao.managedbeans;

import java.io.IOException;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.naming.NamingException;
import javax.servlet.http.HttpServletRequest;

import org.primefaces.component.autocomplete.AutoComplete;
import org.primefaces.component.editor.Editor;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.event.SelectEvent;




//import br.ufpi.hu.prescricao.facade.AghuFacade;
import br.ufpi.hu.prescricao.facade.LaudoFacade;
import br.ufpi.hu.prescricao.facade.UserFacade;
import br.ufpi.hu.prescricao.model.ConsultaEspecialidade;
import br.ufpi.hu.prescricao.model.Laudo;
import br.ufpi.hu.prescricao.model.LaudoBase;
import br.ufpi.hu.prescricao.model.enums.Mensagens;
import br.ufpi.hu.prescricao.util.ErrorHelper;
import br.ufpi.hu.prescricao.util.JasperBuilder;

@ManagedBean
@SessionScoped
public class LaudoMB implements Serializable {

	private static final long serialVersionUID = -336936577231401152L;

	private static final String NOVO_MODELO_LAUDO = "novoModeloLaudo";
	private static final String MODELO_LAUDO = "modeloLaudo";

	private static final String SELECIONE_MODELO = "Selecione um modelo";

	private static final String LAUDO = "laudo";

	private static final String BUSCA_LAUDO = "buscaLaudo";

	private static final String CONFIRMAR_REQUISICAO_EXAMES = null;

	private static final String PACIENTES = null;

	private static final String ERRO = null;

	private static final String MESMA_PAGINA = null;

	@Inject
	private JasperBuilder jasperBuilder;

	@Inject
	private ErrorHelper messageHelper;

	@EJB
	private LaudoFacade laudoFacade;

	@EJB
	private UserFacade userFacade;

	private String relatorioSelecionado;

	private LaudoBase laudo,laudoSelecionado;

	private LaudoLazyDataModel laudoLazyDataModel;

	private ConsultaLazyDataModel consultaLazyDataModel;

	private Date dataInicial, dataFinal;
	private String textoBuscaLaudo;


	public String getTextoBuscaLaudo() {
		return textoBuscaLaudo;
	}

	public void setTextoBuscaLaudo(String textoBuscaLaudo) {
		this.textoBuscaLaudo = textoBuscaLaudo;
	}

	public String getRelatorioSelecionado() {
		return relatorioSelecionado;
	}

	public void setRelatorioSelecionado(String relatorioSelecionado) {
		this.relatorioSelecionado = relatorioSelecionado;
	}

	public String confirmarUltrassonografiaTireoide() {

		return CONFIRMAR_REQUISICAO_EXAMES;
	}

	private String geraRelatorio(Laudo laudo) {

		try {

			jasperBuilder.gerarRelatorio(laudo);

			return PACIENTES;
		} catch (Exception e) {
			messageHelper.sendErrorMessageToUser(ERRO);
			e.printStackTrace();
			return MESMA_PAGINA;
		}
	}

	//MODELO

	private boolean editavel = false;

	public void resetarForm() {

		//		RequestContext.getCurrentInstance().reset("form:panel"); 

		UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();

		InputText descricao = (InputText)  viewRoot.findComponent("form:descricao");
		descricao.setSubmittedValue("");

		Editor texto = (Editor)  viewRoot.findComponent("form:texto");
		texto.setSubmittedValue("");
	}

	public void handleEvent(SelectEvent e) {

		UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();

		//atualizar tela

		Editor texto = (Editor)  viewRoot.findComponent("form:texto");
//		texto.setSubmittedValue(modeloSelecionado.getTexto());

	}

	public boolean isEditavel() {
		return editavel;
	}

	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}

	//autocomplete

	public String laudo() {

		FacesContext context = FacesContext.getCurrentInstance();
//		PrescricaoMB bean = (PrescricaoMB) context.getApplication().evaluateExpressionGet(context, "#{prescricaoMB}", class);
//		bean.setTabAtivaHome(1); //tab laudo

		if (consultaSelecionada==null) {
			messageHelper.sendErrorMessageToUser(Mensagens.SELECIONE_CONSULTA.value());
			return MESMA_PAGINA;
		}

		laudo = new LaudoBase();

		editavel = true;

		return LAUDO;
	}

	public String editarLaudo() {

		editavel = true;

		return MESMA_PAGINA;

	}

	public String removerLaudo() {

		laudoFacade.delete(laudo);

		laudo = new LaudoBase();

		editavel = true;

		messageHelper.sendInfoMessageToUser(Mensagens.LAUDO_DELETADO_SUCESSO.value());

		return LAUDO;
	}

	public String imprimirLaudo() {

		try {

			String rodapeSetorSala = "120720131007S10C04"; //TODO teste rodape para impressão

			//				TODO
			//				String ip = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest().getRemoteAddr();
			//			
			//				if (ip!=null)
			//					rodapeSetorSala = aghuFacade.getSalaSetorFromIp(ip)+new SimpleDateFormat("ddMMyyyyHHmm").format(new Date());

			Map<String, Object> parameters = new HashMap<String,Object>();
			parameters.put("rodapeSetorSala", rodapeSetorSala); //informação de onde partiu a impressão

			jasperBuilder.gerarRelatorio(laudo, parameters);


			return MESMA_PAGINA;
		} catch (Exception e) {
			messageHelper.sendErrorMessageToUser(ERRO);
			e.printStackTrace();
			return MESMA_PAGINA;
		}

	}

	public String salvarLaudo() {

//		laudo.setIdPacienteAghu(laudo.getPaciente().getId());
		salvarLaudo(laudo);

		//		modeloLaudoLazyDataModel = null;

		return MESMA_PAGINA;

	}

	/**
	 * Salva novo ou atualiza existente.
	 * 
	 * @param laudo
	 * @return
	 */
	private String salvarLaudo(LaudoBase laudo) {

		try {
			if (laudo.getId()==0)
			{

				laudoFacade.save(laudo);

				messageHelper.sendInfoMessageToUser(Mensagens.LAUDO_CRIADO_COM_SUCESSO.value());

				editavel = false;
			}
			else
			{
				laudoFacade.update(laudo);
				messageHelper.sendInfoMessageToUser(Mensagens.LAUDO_ATUALIZADO_COM_SUCESSO.value());

				editavel = false;
			}
		}

		catch (Exception e) {
			messageHelper.sendErrorMessageToUser(Mensagens.LAUDO_COM_ERRO.value());
			return MESMA_PAGINA;
		}

		return MESMA_PAGINA;

	}

	public void resetarFormLaudo() {

		UIViewRoot viewRoot = FacesContext.getCurrentInstance().getViewRoot();

		Editor texto = (Editor)  viewRoot.findComponent("form:texto");
		texto.setSubmittedValue("");

		AutoComplete autocomplete = (AutoComplete)  viewRoot.findComponent("form:modelo");
		autocomplete.setSubmittedValue(null);
	}

	public String visualizarLaudo() {

		if (laudoSelecionado==null)
		{
			messageHelper.sendInfoMessageToUser(Mensagens.SELECIONE_LAUDO.value());
			return MESMA_PAGINA;
		}

		editavel = false;

		//FIXME laudos estao indo pra visao com o pacienteVO setado mas retornam com ele null, por isso é necessário resetar
		//Verificar por que isto está ocorrendo e corrigir para evitar duas buscas ao banco
//		if (laudoSelecionado!=null && laudoSelecionado.getIdPacienteAghu() != 0 && laudoSelecionado.getPaciente() == null)
//			laudoSelecionado.setPaciente(aghuFacade.loadPacienteById(laudoSelecionado.getIdPacienteAghu()));


		this.laudo = laudoSelecionado;

		return LAUDO;
	}

	public String pesquisarLaudo() {

		laudo = new LaudoBase();

		return BUSCA_LAUDO;
	}

	public String fazBusca() {

		try {
			getLaudoLazyDataModel().setTexto(textoBuscaLaudo);
			getLaudoLazyDataModel().setDataInicial(dataInicial);
			getLaudoLazyDataModel().setDataFinal(dataFinal);
		} catch (NamingException e) {
			messageHelper.sendErrorMessageToUser(Mensagens.ERRO_BUSCA.value());
			e.printStackTrace();
		}

		return BUSCA_LAUDO;
	}

	public void setLaudoLazyDataModel(
			LaudoLazyDataModel laudoLazyDataModel) {
		this.laudoLazyDataModel = laudoLazyDataModel;
	}

	public LaudoLazyDataModel getLaudoLazyDataModel() throws NamingException {

		if (laudoLazyDataModel==null)		
		{
			laudoLazyDataModel = new LaudoLazyDataModel();
			laudoLazyDataModel.setLaudoFacade(laudoFacade);
//			laudoLazyDataModel.setAghuFacade(aghuFacade);
			laudoLazyDataModel.setUsuarioDaSessao(userFacade.getUsuarioAtual());
		}

		return laudoLazyDataModel;

	}

	public LaudoBase getLaudo() {
		return laudo;
	}

	public void setLaudo(LaudoBase laudo) {
		this.laudo = laudo;
	}

	public Date getDataInicial() {
		return dataInicial;
	}

	public void setDataInicial(Date dataInicial) {
		this.dataInicial = dataInicial;
	}

	public Date getDataFinal() {
		return dataFinal;
	}

	public void setDataFinal(Date dataFinal) {
		this.dataFinal = dataFinal;
	}

	public LaudoBase getLaudoSelecionado() {

		return laudoSelecionado;
	}

	public void setLaudoSelecionado(LaudoBase laudoSelecionado) {
		this.laudoSelecionado = laudoSelecionado;
	}

	//consultas

	private ConsultaEspecialidade consultaSelecionada;


	public ConsultaEspecialidade getConsultaSelecionada() {
		return consultaSelecionada;
	}

	public void setConsultaSelecionada(ConsultaEspecialidade consultaSelecionada) {
		this.consultaSelecionada = consultaSelecionada;
	}

	public void setConsultaLazyDataModel(
			ConsultaLazyDataModel consultaLazyDataModel) {
		this.consultaLazyDataModel = consultaLazyDataModel;
	}

	public ConsultaLazyDataModel getConsultaLazyDataModel() throws NamingException {

		if (consultaLazyDataModel==null)		
		{
			consultaLazyDataModel = new ConsultaLazyDataModel();
//			consultaLazyDataModel.setAghuFacade(aghuFacade);
			consultaLazyDataModel.setUsuarioDaSessao(userFacade.getUsuarioAtual());
		}

		return consultaLazyDataModel;

	}

	public String pesquisarConsulta() {

		try {
			getConsultaLazyDataModel().setDataInicial(dataInicial);
			getConsultaLazyDataModel().setDataFinal(dataFinal);
		} 
		catch (NamingException e) {
			messageHelper.sendErrorMessageToUser(Mensagens.ERRO_BUSCA.value());
			e.printStackTrace();
		}

		return MESMA_PAGINA;
	}

	/**
	 * 
	 * TODO No Primefaces 3.3 não é possível adicionar os dois comportamentos ao mesmo tempo (clique único e duplo clique), tem que ser feito o redirect manual.
	 * <br>
	 * Redirect usando navigationCase pelos meus testes não ficou legal (dois cliques nos botões para ativar as ações). 
	 * 
	 * @see http://code.google.com/p/primefaces/issues/detail?id=2881
	 * @author Leonardo Sampaio
	 * @since 12/07/2013
	 * @param evento evento
	 * @throws IOException
	 */
	public void redirectCliqueDuplo(SelectEvent evento) 
	{

		String url = ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURL().toString().replace("admin/home.xhtml", "")+"laudos/"+LAUDO+".xhtml";

		try{

			consultaSelecionada = (ConsultaEspecialidade) evento.getObject(); //por segurança

			FacesContext.getCurrentInstance().getExternalContext().redirect(url);

			laudo();

		}
		catch (IOException e) {

			messageHelper.sendErrorMessageToUser(Mensagens.ERRO_REDIRECT_DUPLO_CLIQUE.value());

			System.out.println(String.format("SEVERE: Erro em LaudoMB.redirectCliqueDuplo, verificar se o path %s é válido", url));
			e.printStackTrace();
		}

	}

}
